\section{Modelado de las particulas}

Bas\'andonos en los pasos seguidos por los creadores del art\'iculo {\em Advanced Character Physics}\cite{Gamasutra} lo primero que debimos implementar para poder simular un compendio de cuerpos s\'olidos en movimiento, fue el movimiento independiente de cada una de las part\'iculas. Para ello, creamos una clase part\'icula, la cual solamente conten\'ia las variables necesarias para poder calcular la siguiente posici\'on y la aceleraci\'on que se le aplicar\'a a la misma. A su vez, debimos crear una clase controladora que se encargase de hacer el bucle principal. Dicho bucle consta de dos partes: acelerar la part\'icula y calcular la nueva posici\'on.
Para conseguir acelerar una part\'icula, contamos con un vector de tres dimensiones, en el cual ponemos en cada iteraci\'on del bucle principal los valores absolutos de la gravedad.Una vez hemos acelerado la part\'icula, para calcular la siguiente posici\'on en la que se encontrar\'a, utilizamos, como se ha mencionado en el cap\'itulo anterior,el integrador de Verlet.

\[ p' = 2p - p^* +a\cdot \Delta t^2\]

Donde p' representa la posici\'on siguiente, p la posici\'on actual, p* la posici\'on anterior, a el vector aceleraci\'on  y t el aumento de tiempo. Para simular los l\'imites de un entorno en el que la part\'icula se pueda mover libremente, se implementaron las ecuaciones que se muestran a continuaci\'on con tal de que la part\'icula colisione con los bordes de la forma mas realista posible:

\[x = min(max(x,0),width);\]
\[y = min(max(y,0),height);\]
\[z = min(max(z,0),height);\]

Donde x,y,z son las posiciones actuales de cada una de las part\'iculas y {\em width y height} son las medidas de la caja que contiene la part\'icula. Como se puede observar, la implementaci\'on de la colisi\'on con los bordes de la caja que contiene la part\'icula, no contempla la posible elasticidad del choque puesto que, como se mencionar\'a m\'as adelante, uno de los inconvenientes que tiene la aproximaci\'on de {\em Verlet} es que auto genera cantidad de movimiento. Al no contemplar el choque el\'astico, se genera menos cantidad de movimiento y da una sensaci\'on de m\'as realismo a la simulaci\'on.
Para completar la simulaci\'on de varias part\'iculas simultaneas, se tuvo que implementar un sistema que controlara la colisi\'on entre las part\'iculas. Para ello nos basamos en los principios de la cinem\'atica \cite{cinematica}. Antes de resolver la colisi\'on entre dos esferas perfectas, debemos definir cuando habr\'a colisi\'on.

\[colision\Longleftrightarrow{d\leq(r1+r2)}\]

Se dar\'a una colisi\'on si y solo si la distancia entre los centros de dichas part\'iculas es inferior a la suma de sus radios. Para resolver dicha colisi\'on aplicamos la siguiente f\'ormula:

\[target = r^1 + r^2\]
\[length = \sqrt[2]{(x_2-x_1)^2+(y_2-y_1)^2+(z_2-z_1)^2}\]
\[factor = \frac{(length - target)}{length}\]

\[x_1 = x_1-(x*factor*0.5)\]
\[y_1 = y_1-(y*factor*0.5)\]
\[z_1 = z_1-(z*factor*0.5)\]


\[x_2 = x_2+(x*factor*0.5)\]
\[y_2 = y_2+(y*factor*0.5)\]
\[z_2 = z_2+(z*factor*0.5)\]

Donde {\em target} es la distancia objetivo que deber\'an tener las part\'iculas despu\'es de la colisi\'on, {\em length} es la distancia actual entre las dos part\'iculas y factor es la cantidad proporcional de movimiento que debemos aplicar a cada part\'icula para que en la siguiente iteraci\'on alcancen la distancia objetivo. Como se puede observar, solamente se modifica la posici\'on actual de la part\'icula, puesto que al modificar dicha posici\'on, la velocidad se ve directamente afectada.

 En la siguiente figura se puede ver una secuencia de movimientos descritos por una part\'icula siendo acelerada mediante el algoritmo descrito anteriormente:

\begin{figure}[here]
    \centering
    \includegraphics[scale=0.3]{figuras/prueba1.jpg}
	\caption{Animaci\'on de esferas}

\includegraphics[scale=0.3]{figuras/prueba2.jpg}
 \caption{colisi\'on entre esferas}
 
\end{figure}



